[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3で廃止された「先行初期化(Early Initializer)」について解説します。
先行初期化は廃止されます
先行初期化とは、クラスを継承する際に以下のような記述を行うことでした。
class Y extends { ... } with X ...
この機能は削除されました。
そもそもほとんど使われていませんでしたが、解決したかった課題はScala 3で導入された新機能「トレイトパラメータ」によって完全に解決しました。
もともと何がしたかったのか
Scala 2においては、トレイトパラメータが無かったので、以下のような工夫をする必要がありました。
例えば以下のようなコードにおいて、X
の初期化に先んじて変数name
を初期化することができました。
abstract class X { val name: String val greet: String = "Hello, " + name } class Y extends { val name: String = "Bob" } with X ...
ちなみに、以下のようなコードはNullPointerException
が発生します。
name
が初期化される前にX
の初期化に伴いgreet
がname
を呼び出すためです。
class Y extends X { val name: String = "Bob" } ...
移行について
先行初期化はScala 2において非推奨となっています。
また、先行初期化はScala 3.0ではコンパイルエラーとなります。
いっぺんに移行するのが難しい場合は、一時的にabstract class
を定義する方法が提案されています。
サイト内検索
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)